﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DTO.Clases;
using Npgsql;
using NpgsqlTypes;
using DataAccessLayer.Clases;
using System.Collections;
using System.Data;

namespace DataAccessLayer.Clases
{
    public class DaoFormaPago
    {
        private Conexion conexion;
        private NpgsqlCommand comando;
        private NpgsqlDataAdapter miAdapter;
        private DataTable miDataTable;


        private string sqlinsertarformapago = "insertar_forma_pago";
        private string sqllistarformapago = "listado_forma_pago";
        private string sqlmodificarformapago = "modifica_forma_pago";
        private string sqleliminaformapago = "eliminar_forma_pago";
        private string sqlexisteformapago = "existe_forma_pago";

        private string FormaPagoFacturaVenta = "formas_pago_factura_venta";

        /// <summary>
        /// Representa la función: pagos_a_proveedor.
        /// </summary>
        private string PagosProveedor = "pagos_a_proveedor";

        /// <summary>
        /// Representa la función ingresar_forma_pago_venta.
        /// </summary>
        private string IngresarPago = "ingresar_forma_pago_venta";

        /// <summary>
        /// Representa la función insertar_pago_a_proveedor.
        /// </summary>
        private string IngresarPagoProveedor = "insertar_pago_a_proveedor";

        #region Mensajes

        /// <summary>
        /// Representa el mensaje: Ocurrió un error al consultar las formas de pago.
        /// </summary>
        private string ErrorFormaPago = "Ocurrió un error al consultar las formas de pago.\n";

        /// <summary>
        /// Representa el texto: Ocurrió un error al ingresar el pago al Proveedor.
        /// </summary>
        private string ErrorProveedor = "Ocurrió un error al ingresar el pago al Proveedor.\n";

        #endregion

        /// <summary>
        /// constructor forma pago
        /// </summary>
        public DaoFormaPago()
        {
            conexion = new Conexion();
           
        }


        /// <summary>
        /// inserto forma pago
        /// </summary>
        /// <param name="miformapago"></param>
        public void InsertarFormaPago(FormaPago miformapago)
        {
            try
            {
                CargarComandoStoredProcedure(sqlinsertarformapago);
                comando.Parameters.AddWithValue("nombreformapago", miformapago.NombreFormaPago);
                conexion.MiConexion.Open();
                comando.ExecuteNonQuery();
                conexion.MiConexion.Close();
                comando.Dispose();

            }
            catch (Exception ex)
            {
                throw new Exception("Error al insertar forma pago" + ex.Message);
            }
            finally
            {
                conexion.MiConexion.Close();
            }
        }


        /// <summary>
        /// listo en tabla
        /// </summary>
        /// <returns></returns>
        public DataTable ListaFormaPago()
        {
            try
            {
                miDataTable = new DataTable();
                CargarAdapterstoredProsedure(sqllistarformapago);
                this.miAdapter.Fill(miDataTable);
                return miDataTable;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// cargo comando
        /// </summary>
        /// <param name="cmd"></param>

        private void CargarComandoStoredProcedure(string cmd)
        {
            comando = new NpgsqlCommand();
            comando.Connection = conexion.MiConexion;
            comando.CommandText = cmd;
            comando.CommandType = CommandType.StoredProcedure;
        }

        /// <summary>
        /// cargo adapter par tabla forma pago
        /// </summary>
        /// <param name="cmd"></param>
        private void CargarAdapterstoredProsedure(string cmd)
        {
            this.miAdapter = new NpgsqlDataAdapter(cmd, this.conexion.MiConexion);
            this.miAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
        }

        public void IngresarPagoAFactura(FormaPago pago, bool venta)
        {
            try
            {
                if (venta)
                {
                    CargarComandoStoredProcedure(IngresarPago);
                }
                comando.Parameters.AddWithValue("factura", pago.NumeroFactura);
                comando.Parameters.AddWithValue("forma", pago.IdFormaPago);
                comando.Parameters.AddWithValue("usuario", pago.Usuario.Id);
                comando.Parameters.AddWithValue("caja", pago.Caja.Id);
                comando.Parameters.AddWithValue("fecha", pago.Fecha);
                comando.Parameters.AddWithValue("hora", pago.Fecha.TimeOfDay);
                comando.Parameters.AddWithValue("valor", pago.Valor);
                conexion.MiConexion.Open();
                comando.ExecuteNonQuery();
                conexion.MiConexion.Close();
                comando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally { conexion.MiConexion.Close(); }
        }

        /// <summary>
        /// Ingresa los datos del pago o abono realizado a un proveedor.
        /// </summary>
        /// <param name="pago">Pago a realizar.</param>
        public void IngresaPagoAProveedor(FormaPago pago)
        {
            try
            {
                CargarComandoStoredProcedure(IngresarPagoProveedor);
                comando.Parameters.AddWithValue("factura", Convert.ToInt32(pago.NumeroFactura));
                comando.Parameters.AddWithValue("usuario", pago.Usuario.Id);
                comando.Parameters.AddWithValue("caja", pago.Caja.Id);
                comando.Parameters.AddWithValue("forma", pago.IdFormaPago);
                comando.Parameters.AddWithValue("fecha", pago.Fecha);
                comando.Parameters.AddWithValue("hora", pago.Fecha.TimeOfDay);
                comando.Parameters.AddWithValue("valor", pago.Valor);
                conexion.MiConexion.Open();
                comando.ExecuteNonQuery();
                conexion.MiConexion.Close();
                comando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ErrorProveedor + ex.Message);
            }
            finally { conexion.MiConexion.Close(); }
        }

        /// <summary>
        /// modifico forma pago
        /// </summary>
        /// <param name="mipago"></param>
        public void ModificaFormaPago(FormaPago mipago)
        {
            try
            {
                CargarComandoStoredProcedure(sqlmodificarformapago);
                comando.Parameters.AddWithValue("idforma_pago", mipago.IdFormaPago);
                comando.Parameters.AddWithValue("nombreforma_pago", mipago.NombreFormaPago);
                conexion.MiConexion.Open();
                comando.ExecuteNonQuery();
                conexion.MiConexion.Close();
                comando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception("error al modificar forma pago" + ex.Message);
            }
            finally
            {
                conexion.MiConexion.Close();
            }
        }

        /// <summary>
        /// elimino forma pago
        /// </summary>
        /// <param name="id"></param>
        public void EliminaFormaPago(int id)
        {
            try
            {
                CargarComandoStoredProcedure(sqleliminaformapago);
                comando.Parameters.AddWithValue("idforma_pago", id);

                conexion.MiConexion.Open();
                comando.ExecuteNonQuery();
                conexion.MiConexion.Close();
                comando.Dispose();

            }
            catch (Exception ex)
            {
                throw new Exception("error al eliminar" + ex.Message);
            }
            finally
            {
                conexion.MiConexion.Close();
            }
        }

        /// <summary>
        /// existe forma de pago
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public bool ExisteFormaPago(string nombre)
        {
            try
            {
                CargarComandoStoredProcedure(sqlexisteformapago);
                comando.Parameters.AddWithValue("nombreforma_pago", nombre);
                conexion.MiConexion.Open();
                var resultado = Convert.ToBoolean(comando.ExecuteScalar());
                comando.ExecuteNonQuery();
                conexion.MiConexion.Close();
                comando.Dispose();
                return resultado;
            }
            catch (Exception ex)
            {
                throw new Exception("Forma Pago ya Existe" + ex.Message);
            }
            finally
            {
                conexion.MiConexion.Close();
            }
        }

        /// <summary>
        /// Obtiene el listado de las formas de pago de una Factura de Venta.
        /// </summary>
        /// <param name="numero">Número de la factura de venta.</param>
        /// <returns></returns>
        public DataTable FormasDePagoDeFacturaVenta(string numero)
        {
            var tabla = new DataTable();
            try
            {
                CargarAdapterstoredProsedure(FormaPagoFacturaVenta);
                miAdapter.SelectCommand.Parameters.AddWithValue("numero", numero);
                miAdapter.Fill(tabla);
                return tabla;
            }
            catch (Exception ex)
            {
                throw new Exception(ErrorFormaPago + ex.Message);
            }
        }

        /// <summary>
        /// Obtiene los datos de los pagos o abono realizados a una factura de Proveedor.
        /// </summary>
        /// <param name="idFactura">Id de la factura a consultar pagos.</param>
        /// <returns></returns>
        public DataTable PagosAProveedor(int idFactura)
        {
            var tabla = new DataTable();
            try
            {
                CargarAdapterstoredProsedure(PagosProveedor);
                miAdapter.SelectCommand.Parameters.AddWithValue("id", idFactura);
                miAdapter.Fill(tabla);
                return tabla;
            }
            catch (Exception ex)
            {
                throw new Exception(ErrorFormaPago + ex.Message);
            }
        }
    }
}